﻿2026-05-14T10:09:07.3693245Z ##[group]Run pnpm verify:phase-4
2026-05-14T10:09:07.3693576Z [36;1mpnpm verify:phase-4[0m
2026-05-14T10:09:07.3727285Z shell: /usr/bin/bash -e {0}
2026-05-14T10:09:07.3727543Z env:
2026-05-14T10:09:07.3727791Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-14T10:09:07.3728126Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-14T10:09:07.3728362Z   SKIP_TRACE_CHECK: 1
2026-05-14T10:09:07.3728595Z ##[endgroup]
2026-05-14T10:09:07.6871771Z 
2026-05-14T10:09:07.6872630Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-14T10:09:07.6873760Z > node scripts/verify-phase-4.mjs
2026-05-14T10:09:07.6874361Z 
2026-05-14T10:09:07.7192736Z 
2026-05-14T10:09:07.7193649Z === Workspace: typecheck ===
2026-05-14T10:09:07.7194429Z >>> pnpm -r typecheck
2026-05-14T10:09:08.0329075Z Scope: 5 of 6 workspace projects
2026-05-14T10:09:08.0386800Z packages/db typecheck$ tsc --noEmit
2026-05-14T10:09:08.0395682Z packages/game-logic typecheck$ tsc --noEmit
2026-05-14T10:09:10.7733953Z packages/game-logic typecheck: Done
2026-05-14T10:09:10.7806494Z packages/protocol typecheck$ tsc --noEmit
2026-05-14T10:09:12.8759453Z packages/db typecheck: Done
2026-05-14T10:09:14.1776928Z packages/protocol typecheck: Done
2026-05-14T10:09:14.1811669Z apps/client typecheck$ tsc --noEmit
2026-05-14T10:09:14.1812516Z apps/server typecheck$ tsc --noEmit
2026-05-14T10:09:26.0141812Z apps/client typecheck: Done
2026-05-14T10:09:26.7071464Z apps/server typecheck: Done
2026-05-14T10:09:26.7173380Z 
2026-05-14T10:09:26.7173812Z === Lint: protocol-sync ===
2026-05-14T10:09:26.7174345Z >>> pnpm lint:protocol-sync
2026-05-14T10:09:27.0230328Z 
2026-05-14T10:09:27.0231377Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-14T10:09:27.0232583Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-14T10:09:27.0233232Z 
2026-05-14T10:09:27.0538500Z lint-protocol-sync: OK
2026-05-14T10:09:27.0658506Z 
2026-05-14T10:09:27.0659223Z === Lint: game-logic-purity ===
2026-05-14T10:09:27.0660042Z >>> pnpm lint:game-logic-purity
2026-05-14T10:09:27.3724443Z 
2026-05-14T10:09:27.3725848Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-14T10:09:27.3727152Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-14T10:09:27.3727844Z 
2026-05-14T10:09:27.4035166Z lint-game-logic-purity: OK (7 file(s) clean)
2026-05-14T10:09:27.4149427Z 
2026-05-14T10:09:27.4150266Z === Lint: better-auth-schema-sync ===
2026-05-14T10:09:27.4151808Z >>> pnpm lint:better-auth-schema-sync
2026-05-14T10:09:27.7185930Z 
2026-05-14T10:09:27.7186871Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-14T10:09:27.7188020Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-14T10:09:27.7192736Z 
2026-05-14T10:09:29.3452828Z lint-better-auth-schema-sync: OK
2026-05-14T10:09:29.3571529Z 
2026-05-14T10:09:29.3572087Z === Lint: rate-limit-budgets ===
2026-05-14T10:09:29.3573111Z >>> pnpm lint:rate-limit-budgets
2026-05-14T10:09:29.6558939Z 
2026-05-14T10:09:29.6559998Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-14T10:09:29.6561295Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-14T10:09:29.6561998Z 
2026-05-14T10:09:29.6865063Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-14T10:09:29.6978581Z 
2026-05-14T10:09:29.6979094Z === Lint: no-clipboard-rce ===
2026-05-14T10:09:29.6979853Z >>> pnpm lint:no-clipboard-rce
2026-05-14T10:09:29.9993010Z 
2026-05-14T10:09:29.9994106Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-14T10:09:29.9995356Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-14T10:09:29.9996352Z 
2026-05-14T10:09:30.0339547Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-14T10:09:30.0475988Z 
2026-05-14T10:09:30.0485067Z === Lint: room-layout ===
2026-05-14T10:09:30.0485971Z >>> pnpm lint:room-layout
2026-05-14T10:09:30.3473674Z 
2026-05-14T10:09:30.3474645Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-14T10:09:30.3475937Z > node tools/scripts/lint-room-layout.mjs
2026-05-14T10:09:30.3477152Z 
2026-05-14T10:09:30.3813345Z lint-room-layout: OK
2026-05-14T10:09:30.3927240Z 
2026-05-14T10:09:30.3927702Z === ADR 0004 lint ===
2026-05-14T10:09:30.3928344Z >>> pnpm lint:adr:0004
2026-05-14T10:09:30.6939309Z 
2026-05-14T10:09:30.6940306Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-14T10:09:30.6941868Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-14T10:09:30.6942977Z 
2026-05-14T10:09:30.7226710Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-14T10:09:30.7336932Z 
2026-05-14T10:09:30.7337426Z === Drizzle: emit-check ===
2026-05-14T10:09:30.7338354Z >>> pnpm db:emit-check
2026-05-14T10:09:31.0338105Z 
2026-05-14T10:09:31.0339181Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-14T10:09:31.0342410Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-14T10:09:31.0344607Z 
2026-05-14T10:09:31.4728639Z No config path provided, using default 'drizzle.config.ts'
2026-05-14T10:09:31.4731290Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-14T10:09:31.8927251Z 8 tables
2026-05-14T10:09:31.8928204Z accounts 8 columns 1 indexes 0 fks
2026-05-14T10:09:31.8929078Z audit_log 6 columns 0 indexes 2 fks
2026-05-14T10:09:31.8932507Z characters 9 columns 0 indexes 1 fks
2026-05-14T10:09:31.8933448Z inventory_items 4 columns 0 indexes 1 fks
2026-05-14T10:09:31.8934457Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-14T10:09:31.8935748Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-14T10:09:31.8936660Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-14T10:09:31.8937432Z sessions 5 columns 0 indexes 1 fks
2026-05-14T10:09:31.8938014Z 
2026-05-14T10:09:31.8939028Z No schema changes, nothing to migrate 😴
2026-05-14T10:09:32.2383130Z 
2026-05-14T10:09:32.2383820Z === Drizzle: schema-sync ===
2026-05-14T10:09:32.2384608Z >>> pnpm lint:schema-sync
2026-05-14T10:09:32.5380401Z 
2026-05-14T10:09:32.5381448Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-14T10:09:32.5384947Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-14T10:09:32.5388202Z 
2026-05-14T10:09:32.5642772Z OK
2026-05-14T10:09:32.5760874Z 
2026-05-14T10:09:32.5761514Z === Drizzle: source-comments ===
2026-05-14T10:09:32.5762390Z >>> pnpm lint:source-comments
2026-05-14T10:09:32.8963200Z 
2026-05-14T10:09:32.8964279Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-14T10:09:32.8965955Z > pnpm -C packages/db run lint:source-comments
2026-05-14T10:09:32.8966703Z 
2026-05-14T10:09:33.2006536Z 
2026-05-14T10:09:33.2007825Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-14T10:09:33.2009511Z > node scripts/check-source-comments.mjs
2026-05-14T10:09:33.2010196Z 
2026-05-14T10:09:33.2319932Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-14T10:09:33.2520903Z 
2026-05-14T10:09:33.2522949Z === Workspace: test ===
2026-05-14T10:09:33.2523640Z >>> pnpm -r test
2026-05-14T10:09:33.5561229Z Scope: 5 of 6 workspace projects
2026-05-14T10:09:33.5614509Z packages/db test$ vitest run
2026-05-14T10:09:33.5622875Z packages/game-logic test$ vitest run
2026-05-14T10:09:34.0860847Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-14T10:09:34.0863247Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-14T10:09:34.5187544Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-14T10:09:34.7142870Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:09:34.9508211Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-14T10:09:35.0993321Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-14T10:09:35.1777931Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:09:35.3178202Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:09:35.4029386Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:09:35.6202527Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:09:35.8681412Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-14T10:09:36.0818253Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:09:36.1117920Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-14T10:09:36.1448701Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-14T10:09:36.1454333Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-14T10:09:36.1456360Z packages/db test: [2m   Start at [22m 10:09:34
2026-05-14T10:09:36.1458144Z packages/db test: [2m   Duration [22m 2.05s[2m (transform 173ms, setup 0ms, import 1.41s, tests 30ms, environment 1ms)[22m
2026-05-14T10:09:36.1584850Z packages/db test: Done
2026-05-14T10:09:36.1599503Z packages/protocol test$ vitest run
2026-05-14T10:09:36.2907773Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:09:36.5193735Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-14T10:09:36.5266952Z packages/game-logic test: [2m Test Files [22m [1m[32m10 passed[39m[22m[90m (10)[39m
2026-05-14T10:09:36.5315255Z packages/game-logic test: [2m      Tests [22m [1m[32m50 passed[39m[22m[90m (50)[39m
2026-05-14T10:09:36.5341408Z packages/game-logic test: [2m   Start at [22m 10:09:34
2026-05-14T10:09:36.5350771Z packages/game-logic test: [2m   Duration [22m 2.45s[2m (transform 242ms, setup 0ms, import 440ms, tests 89ms, environment 2ms)[22m
2026-05-14T10:09:36.5775837Z packages/game-logic test: Done
2026-05-14T10:09:36.6541856Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-14T10:09:36.9397055Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-14T10:09:37.0956538Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:09:37.2543564Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:09:37.4055911Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T10:09:37.4116761Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-14T10:09:37.4118255Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-14T10:09:37.4120133Z packages/protocol test: [2m   Start at [22m 10:09:36
2026-05-14T10:09:37.4123848Z packages/protocol test: [2m   Duration [22m 748ms[2m (transform 103ms, setup 0ms, import 214ms, tests 31ms, environment 0ms)[22m
2026-05-14T10:09:37.4398956Z packages/protocol test: Done
2026-05-14T10:09:37.4403785Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-14T10:09:37.4406722Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-14T10:09:37.9454552Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-14T10:09:38.0802973Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-14T10:09:39.0586293Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 63[2mms[22m[39m
2026-05-14T10:09:39.3985793Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-14T10:09:39.7882304Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 32[2mms[22m[39m
2026-05-14T10:09:39.9938337Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-14T10:09:39.9947334Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-14T10:09:40.0772857Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 256[2mms[22m[39m
2026-05-14T10:09:40.0893300Z apps/server test: {"level":40,"time":1778753380086,"pid":3354,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T10:09:40.0963634Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-14T10:09:40.1007063Z apps/server test: {"level":40,"time":1778753380089,"pid":3354,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T10:09:40.1037031Z apps/server test: {"level":40,"time":1778753380090,"pid":3354,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T10:09:41.0784665Z apps/server test: {"level":30,"time":1778753381076,"pid":3365,"hostname":"runnervmrw5os","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-14T10:09:41.0803854Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 746[2mms[22m[39m
2026-05-14T10:09:41.0834619Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 599[2mms[22m[39m
2026-05-14T10:09:41.1863068Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 61[2mms[22m[39m
2026-05-14T10:09:42.0388526Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-14T10:09:42.0406801Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-dnx0FF/rebno.db
2026-05-14T10:09:42.0416751Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:09:42.0417823Z apps/server test: [run-migrations] OK
2026-05-14T10:09:42.0502899Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-14T10:09:42.0526764Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-wLyfBs/rebno.db
2026-05-14T10:09:42.0530668Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:09:42.0534881Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-14T10:09:42.0536343Z apps/server test: [run-migrations] OK
2026-05-14T10:09:42.0634238Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-14T10:09:42.0636847Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-SCczOG/rebno.db
2026-05-14T10:09:42.0638591Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:09:42.0639806Z apps/server test: [run-migrations] OK
2026-05-14T10:09:42.0641756Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-14T10:09:42.0643749Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-SCczOG/rebno.db
2026-05-14T10:09:42.0645279Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:09:42.0646789Z apps/server test: [run-migrations] OK
2026-05-14T10:09:42.0713306Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 56[2mms[22m[39m
2026-05-14T10:09:42.2572891Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-14T10:09:42.3586687Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-14T10:09:42.6477511Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-14T10:09:42.9247298Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 26[2mms[22m[39m
2026-05-14T10:09:43.1536476Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:09:43.3337885Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-14T10:09:43.9479259Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-14T10:09:43.9500703Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ suppress logs { quiet: true }
2026-05-14T10:09:43.9506652Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-14T10:09:44.6457755Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-14T10:09:44.6870571Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:09:44.6997098Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-14T10:09:44.7036816Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-14T10:09:44.7039777Z apps/server test: [2m   Start at [22m 10:09:37
2026-05-14T10:09:44.7077655Z apps/server test: [2m   Duration [22m 6.74s[2m (transform 483ms, setup 0ms, import 3.31s, tests 997ms, environment 2ms)[22m
2026-05-14T10:09:44.7378926Z apps/server test: Done
2026-05-14T10:09:45.3473497Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-14T10:09:46.0063348Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-14T10:09:46.7289669Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 70[2mms[22m[39m
2026-05-14T10:09:47.4540889Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 85[2mms[22m[39m
2026-05-14T10:09:48.1386459Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 32[2mms[22m[39m
2026-05-14T10:09:48.8467647Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 72[2mms[22m[39m
2026-05-14T10:09:49.5603520Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 75[2mms[22m[39m
2026-05-14T10:09:50.2203731Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:09:50.9310183Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 77[2mms[22m[39m
2026-05-14T10:09:51.5951319Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:09:52.2514520Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:09:52.9037156Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T10:09:53.5553348Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-14T10:09:54.2023987Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:09:54.8569379Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:09:55.5132742Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:09:56.1517323Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:09:56.8080032Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 3[2mms[22m[39m
2026-05-14T10:09:57.4506466Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:09:58.1073598Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:09:58.7778622Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T10:09:58.7996024Z apps/client test: [2m Test Files [22m [1m[32m26 passed[39m[22m[90m (26)[39m
2026-05-14T10:09:58.8012603Z apps/client test: [2m      Tests [22m [1m[32m193 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (197)[39m
2026-05-14T10:09:58.8022064Z apps/client test: [2m   Start at [22m 10:09:38
2026-05-14T10:09:58.8025983Z apps/client test: [2m   Duration [22m 20.72s[2m (transform 798ms, setup 55ms, collect 1.24s, tests 884ms, environment 12.09s, prepare 2.35s)[22m
2026-05-14T10:09:58.9326480Z apps/client test: Done
2026-05-14T10:09:58.9397539Z 
2026-05-14T10:09:58.9398009Z verify-phase-4: OK (12 steps green)
